// 函数返回值 默认/可选参数(设置默认值的情况就已经包含了?的情况，所以它们不能同时设置)
const myAdd = (a: number, b: number = 10, c: number = 20): number => {
  return a + b;
};

console.log(myAdd(1));

// rest运算符

const sum = (...result: Array<number>): number =>
  result.reduce((p: number, n: number): number => p + n, 0);

console.log(sum(1, 2, 3, 4, 5));

// 函数重载(与java不同)。  函数名相同，但是参数不同。有不同的反应
// 其实就是告诉调用者 不同传入参数类型 对应 不同的返回值类型
function getInfo(age: number): number;
function getInfo(name: string): string;

function getInfo(str: any): any {
  if (typeof str === "string") {
    return "str -> " + str;
  }
  if (typeof str === "number") {
    return 0 + str;
  }
}

function getMoreInfo(id: number): string;
function getMoreInfo(sex: number, name: string): string;

function getMoreInfo(param1: any, name?: any): any {
  if (name) {
    return id + "我的名字是" + name;
  } else {
    return id + "我没有名字";
  }
}
// getInfo(true) // 没有对应的处理方式，就报错咯
// 重载就是用来解决下面这个需求。
// 输入数字，返回字符串。 输入字符串 返回数字.
// 同一个函数分别针对几种不同传入参数的类型，作出不同处理 并声明不同的参数与返回值类型
// function test(x: number | string): number | string {
//     if (typeof x === 'number') return x + '';
//     if (typeof x === 'string') return x - 0;
// }
